class Solution {
	// 要点：二叉搜索树中根节点的值大于左子树中的任何一个节点的值，小于右子树中任何一个节点的值，子树也是
    public boolean verifyPostorder(int[] postorder) {
        if (postorder.length <= 1) return true; // 特殊情况
        return helper(postorder, 0, postorder.length - 1);
    }

    public boolean helper(int[] postorder, int left, int right) {
        if (left >= right) return true; // 退出条件
        // 后序遍历 左子树 右子树 根 最后一个元素一定是根节点
        int rootValue = postorder[right]; // 获取该数组范围中的根节点
        int k = left;
        while (k < right && postorder[k] < rootValue) k++; // 找到左子树  判断（假设）左子树是都都小于root
        // 此时的k 其实就是左子树和右子树的分界点    k-> 右子树最左边的第一个元素
        for (int i = k; i < right; i++) {
            if (postorder[i] < rootValue) return false; // 判断右子树是否都大于根节点
        }
        return helper(postorder, left, k - 1) && helper(postorder, k, right - 1);
    }
}
// 针对于每一个节点，它的左子树一定小于根节点，根节点一定小于右子树
// 1 3 2 6 				root 5

// 